package com.biz.primus.app.rest.feign.member;

import com.biz.primus.app.rest.degraded.member.DegradedMemberFeignClient;
import com.biz.primus.base.global.GlobalParams;
import com.biz.primus.model.member.enums.InvoiceTypes;
import com.biz.primus.model.member.vo.*;
import com.biz.primus.model.member.vo.request.*;
import com.biz.primus.model.member.vo.response.*;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * @author jun.liu
 * @since 2017年11月3日
 * @usage
 * @reviewer
 */
@FeignClient(qualifier = "memberFeignClient", name = "service-member", fallback = DegradedMemberFeignClient.class)
public interface MemberFeignClient
{

    /**
     * 注册
     * @param reqVo
     */
    @PostMapping("soa/memberService/register")
    MemberRegisterResponseVo register(@RequestBody MemberRegisterRequestVo reqVo);

    /**
     * 登录
     * @param reqVo
     */
    @PostMapping("soa/memberService/login")
    MemberLoginResponseVo login(@RequestBody MemberLoginRequestVo reqVo, @RequestParam("enableAuthToken") Boolean enableAuthToken);

    /**
     * 验证码登录
     * @param reqVo
     */
    @PostMapping("soa/memberService/smsCodeLogin")
    MemberLoginResponseVo smsCodeLogin(@RequestBody MemberSmsCodeLoginRequestVo reqVo, @RequestParam("enableAuthToken") Boolean enableAuthToken);

    /**
     * 自动登录
     * @param reqVo
     */
    @PostMapping("soa/memberService/autologin")
    MemberLoginResponseVo autologin(@RequestBody BaseRequestVo reqVo, @RequestParam("enableAuthToken") Boolean enableAuthToken);

    /**
     * 修改密码
     * @param reqVo
     */
    @PostMapping("soa/memberService/changePassword")
    void changePassword(@RequestBody MemberChangePasswordRequestVo reqVo);

    /**
     * 重置密码
     * @param reqVo
     */
    @PostMapping("soa/memberService/resetPassword")
    void resetPassword(@RequestBody MemberResetPasswordRequestVo reqVo);

    /**
     * 根据用户id和渠道编码查询用户信息，返回数据和登录一样
     * @param reqVo
     */
    @GetMapping("soa/memberService/getUserInfo")
    MemberLoginResponseVo getUserInfo(BaseRequestVo reqVo, @RequestParam("enableAuthToken") Boolean enableAuthToken);

    /**
     * 更新个人信息(生日,性别,昵称
     * @param reqVo
     */
    @PostMapping("soa/memberService/updatePersonalInfo")
    void updatePersonalInfo(@RequestBody UpdateMemberPersonalInfoRequestVo reqVo);

    /**
     * 更新用户头像
     * @param reqVo
     */
    @PostMapping("soa/memberService/updateAvatar")
    void updateAvatar(@RequestBody UpdateMemberAvatarRequestVo reqVo);

    //********************************************
    //               足迹end
    //********************************************
    /**
     * 分页获取用户足迹
     * @param reqVo
     */
    @GetMapping("soa/memberService/findFootprint")
    PageVo findFootprint(@RequestBody BasePageableRequestVo reqVo);

    /**
     * 记录一次用户足迹
     * @param reqVo
     */
    @PostMapping("soa/memberService/recordFootprint")
    void recordFootprint(@RequestBody MemberFootprintVo reqVo);

    /**
     * 清除用户足迹
     * @param reqVo
     */
    @PostMapping("soa/memberService/clearFootprint")
    void clearFootprint(@RequestBody BaseRequestVo reqVo);
    //********************************************
    //               足迹start
    //********************************************

    //********************************************
    //               优惠卷start
    //********************************************
    /**
     * 分页获取个人中心优惠券列表
     * @param reqVo
     */
    @GetMapping("soa/memberService/couponList")
    PageVo couponList(@RequestBody MemberCouponRequestVo reqVo);

    /**
     * 优惠卷详情
     * @param reqVo
     */
    @GetMapping("soa/memberService/getCouponDetail")
    MemberCouponCodeVo getCouponDetail(@RequestBody MemberCouponCodeRequestVo reqVo);
    //********************************************
    //               优惠卷end
    //********************************************


    //********************************************
    //               银行卡start
    //********************************************
    /**
     * 根据用户id获取银行卡信息
     * @param reqVo
     */
    @GetMapping("soa/memberService/getBankcardInfo")
    MemberBankCardVo getBankcardInfo(@RequestBody GlobalParams reqVo);

    /**
     * 更新银行卡信息
     * @param reqVo
     */
    @PostMapping("soa/memberService/updateBankcardInfo")
    void updateBankcardInfo(@RequestBody MemberBankCardVo reqVo);
    //********************************************
    //               银行卡end
    //********************************************


    //********************************************
    //               发票start
    //********************************************
    /**
     * 用户中心里 获取所有发票信息
     * @param memberId
     */
    @GetMapping("soa/memberService/getUserInvoices")
    List<MemberInvoiceVo> getUserInvoices(@RequestParam("invoiceType") InvoiceTypes invoiceType, @RequestParam("memberId") Long memberId);

    /**
     * 保存或新增发票
     * @param reqVo
     */
    @PostMapping("soa/memberService/saveUserInvoice")
    void saveUserInvoice(@RequestBody MemberInvoiceVo reqVo);

    /**
     * 删除发票
     *  @param invoiceId
     */
    @PostMapping("soa/memberService/deleteOneInvoice")
    void deleteOneInvoice(@RequestParam("invoiceId") Long invoiceId);

    /**
     * 根据id获取发票信息
     * @param invoiceId
     */
    @GetMapping("soa/memberService/findOrderInvoiceById")
    MemberInvoiceVo findOrderInvoiceById(@RequestParam("invoiceId") Long invoiceId);
    //********************************************
    //               发票end
    //********************************************

    //********************************************
    //               收藏start
    //********************************************
    /**
     * 添加收藏
     * @param reqVo
     */
    @PostMapping("soa/memberService/addFavourite")
    void addFavourite(@RequestBody ProductCodeRequestVo reqVo);

    /**
     * 收藏列表
     * @param reqVo
     */
    @GetMapping("soa/memberService/favouriteList")
    PageVo favouriteList(@RequestBody BasePageableRequestVo reqVo);

    /**
     * 清空收藏
     * @param reqVo
     */
    @PostMapping("soa/memberService/clearFavourite")
    void clearFavourite(@RequestBody BaseRequestVo reqVo);

    /**
     * 查询收藏商品的总数
     * @param reqVo
     */
    @GetMapping("soa/memberService/getFavouriteProductTotal")
    Long getFavouriteProductTotal(@RequestBody BaseRequestVo reqVo);

    /**
     * 批量删除收藏商品
     * @param reqVo
     */
    @PostMapping("soa/memberService/deleteFavouriteProducts")
    void deleteFavouriteProducts(@RequestBody DeleteFavouriteProductsRequestVo reqVo);
    //********************************************
    //               收藏end
    //********************************************


    //********************************************
    //               token end
    //********************************************
    /**
     * 生成新的token并保存
     * @param memberId 会员id
     * @return 生成的token
     */
    @PostMapping("soa/memberService/generateNewToken")
    String generateNewToken(@RequestParam("memberId") Long memberId);

    /**
     * 授权,不通过抛出code 1919或1909异常 客户端将做强退处理
     * @param token
     * @param memberId
     */
    @PostMapping("soa/memberService/authenticate")
    void authenticate(@RequestParam("token") String token, @RequestParam("memberId") Long memberId);

    /**
     * 刷新token(使用旧token鉴权并创建新token)
     * @param oldToken
     * @param memberId
     * @return 返回新的token
     */
    @PostMapping("soa/memberService/refreshToken")
    String refreshToken(@RequestParam("oldToken") String oldToken, @RequestParam("memberId") Long memberId);

    /**
     * 根据用户id查询登录token
     * @param memberId
     */
    @GetMapping("soa/memberService/findTokenByUserId")
    String findTokenByUserId(@RequestParam("memberId") Long memberId);
    //********************************************
    //               token end
    //********************************************

    //********************************************
    //               address start
    //********************************************
    /**
     * 更新或保存地址标签
     * 标签名重复时会抛出异常
     */
    @PostMapping("soa/memberService/saveOrUpdateLabel")
    void saveOrUpdateLabel(@RequestBody MemberAddressCheckLabelNameRequestVo reqVo);

    /**
     * 获取用户所有的标签
     */
    @GetMapping("soa/memberService/getAllUserLabel")
    List<MemberAddressLabelVo> getAllUserLabel(@RequestParam("memberId") Long memberId);

    /**
     * 删除标签
     */
    @PostMapping("soa/memberService/deleteLabelNew")
    List<MemberAddressLabelVo> deleteLabelNew(@RequestBody MemberAddressIdRequestVo reqVo);

    /**
     * 保存或更新收货地址
     */
    @PostMapping("soa/memberService/saveOrUpdateAddress")
    List<MemberAddressVo> saveOrUpdateAddress(@RequestBody MemberAddressVo reqVo);

    /**
     * 删除收货地址
     */
    @PostMapping("soa/memberService/deleteAddressNew")
    List<MemberAddressVo> deleteAddressNew(@RequestBody MemberAddressIdRequestVo reqVo);

    /**
     * 获取所有收货地址
     */
    @GetMapping("soa/memberService/getAllAddress")
    List<MemberAddressVo> getAllAddress(MemberAddressNewRequestVo reqVo);

    /**
     * 查看收货地址附近有无门店
     */
    @GetMapping("soa/memberService/checkStore")
    MemberAdddressCheckStoreResponseVo checkStore(@RequestBody BaseVo reqVo);

    /**
     * 根据请求参数的会员id获取家 地址
     */
    @GetMapping("soa/memberService/findMemberAddressOfHome")
    MemberAddressVo findMemberAddressOfHome(@RequestBody BaseRequestVo reqVo);

    /**
     * 根据请求参数的会员id获取公司 地址
     */
    @GetMapping("soa/memberService/findMemberAddressOfCompany")
    MemberAddressVo findMemberAddressOfCompany(@RequestBody BaseRequestVo reqVo);

    /**
     * 根据请求参数的会员id和关键字查询地址
     */
    @GetMapping("soa/memberService/findMemberAddressOnMemberIdAndKeyword")
    MemberAddressVo findMemberAddressOnMemberIdAndKeyword(@RequestBody BaseRequestVo reqVo, @RequestParam("keyword") String keyword);

    /**
     * 根据id查询地址
     */
    @GetMapping("soa/memberService/findMemberAddressById")
    MemberAddressVo findMemberAddressById(@RequestBody BaseVo reqVo);
    //********************************************
    //               address end
    //********************************************

    //********************************************
    //               notice start
    //********************************************
    @GetMapping("soa/memberService/getAllNoticeRo")
    List<NoticeVo> getAllNoticeRo(@RequestBody NoticePageRequestVo reqVo);

    @GetMapping("soa/memberService/getUserRemainNotices")
    List<NoticeVo> getUserRemainNotices(@RequestBody NoticePageRequestVo reqVo);
    //********************************************
    //               notice end
    //********************************************

}
